#include <iostream>
#include <string>
#include <fstream>
#include "Contact.pb.h"

using namespace std;
using namespace contacts;


void AddPeopleInfo(PeopleInfo *people_info_ptr)
{
    cout << "-------------新增联系⼈-------------" << endl;
    cout << "请输⼊联系⼈姓名: ";
    string name;
    getline(cin, name);
    people_info_ptr->set_name(name);
    
    cout << "请输⼊联系⼈年龄: ";
    int age;
    cin >> age;
    people_info_ptr->set_age(age);
    string number;

    for(int i = 1; ; i++) {
    cout << "请输⼊联系⼈电话" << i << "(只输⼊回⻋完成电话新增): ";
    getline(cin, number);
    if (number.empty()) {
     break;
    }
    }

    PeopleInfo_Phone* phone = people_info_ptr->add_phone();
    phone->set_number(number);

    cout << "-----------添加联系⼈成功-----------" << endl;

}

int main(int argc, char* argv[])
{
    // GOOGLE_PROTOBUF_VERIFY_VERSION 宏: 验证没有意外链接到与编译的头⽂件不兼容的库版
    // 本。如果检测到版本不匹配，程序将中⽌。注意，每个 .pb.cc ⽂件在启动时都会⾃动调⽤此宏。在使
    // ⽤ C++ Protocol Buffer 库之前执⾏此宏是⼀种很好的做法，但不是绝对必要的。
    // 43 GOOGLE_PROTOBUF_VERIFY_VERSION;
    if(argc != 2)
    {
        cerr << "Usage: " << argv[0] << " CONTACTS_FILE" << endl;
        return -1;
    }

   contacts::Contacts contacts;      
    // 先读取已存在的 contacts
    fstream input(argv[1], ios::in | ios::binary);
    if(!input)
    {
        cout << argv[1] << ": File not found. Creating a new file." << endl;
    }
    else if (!contacts.ParseFromIstream(&input))
    {
        cerr << "Failed to parse contacts." << endl;
        input.close();
        return -1;
    }

    // 新增⼀个联系⼈ 
    AddPeopleInfo(contacts.add_contacts());

    // 向磁盘⽂件写⼊新的 contacts
    fstream output(argv[1],ios::out | ios::trunc | ios::binary);
    if(!contacts.SerializeToOstream(&output))
    {
        cerr << "Failed to write contacts." << endl;
        input.close();
        output.close();
        return -1;
    }
    input.close();
    output.close();

    // 在程序结束时调⽤ ShutdownProtobufLibrary()，为了删除 Protocol Buffer 库分配的所
    // 有全局对象。对于⼤多数程序来说这是不必要的，因为该过程⽆论如何都要退出，并且操作系统将负责
    // 回收其所有内存。但是，如果你使⽤了内存泄漏检查程序，该程序需要释放每个最后对象，或者你正在
    // 编写可以由单个进程多次加载和卸载的库，那么你可能希望强制使⽤ Protocol Buffers 来清理所有
    // 内容。
    google::protobuf::ShutdownProtobufLibrary();
    return 0;
    
}